perm filename SPRNG1.SAI[VIS,HPM] blob
sn#126072 filedate 1974-10-20 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00003 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 BEGIN "SPRING"
C00009 00003 MAIN PROGRAM
C00011 ENDMK
C⊗;
BEGIN "SPRING"
REQUIRE "WINNIC.SAI[VIS,HPM]" SOURCE_FILE;
REQUIRE "HELIB[1,3]" LIBRARY;
EXTERNAL INTEGER BCLIP,TCLIP;
MAKPIX(200,200,4);
TCLIP←0; BCLIP←7;
BEGIN "INNER"
INTEGER ARRAY PIC[1:2,1:PICSIZ];
INTEGER WINDOW,WHIPIX,CORWIN;
REAL TX,TY;
INTEGER ARRAY FEAT[1:3,1:4,1:100];
WINDOW←12;
MAKPIX(200,200,4); INIWIN(WINDOW);
BEGIN
INTEGER CURPIC,PREPIC;
INTEGER ARRAY PIC[1:2,1:PICSIZ];
INTEGER PROCEDURE HORIZON;
BEGIN
INTEGER ARRAY WINS[-1:VERWIN,1:HORWIN];
INTEGER SUM,I,J,NF;
INTEGER DX1,DX2,DY1,DY2,T,BST,BSTBST,H,SCANX,SCANY;
SUM←DOWIN(PIC[PREPIC,1],WINS[1,1]);
NF←0;
FOR I←2 STEP 1 UNTIL VERWIN-3 DO
FOR J←3 STEP 1 UNTIL HORWIN-2 DO
IF (WINS[I,J] LAND 1)=0 ∧ WINS[I,J]≥SUM THEN
BEGIN
FEAT[1,PREPIC,NF←NF+1]←(J-1)*WINDOW+1;
FEAT[2,PREPIC,NF]←(I-1)*WINDOW+1;
FEAT[3,PREPIC,NF]←WINS[I,J];
END;
WINDOW←CORWIN;
INIWIN(WINDOW);
TX←WINDOW/PICWID;
TY←WINDOW/PICHIG;
BSTBST←'377777000000;
DO
BEGIN
H←1; BST←0;
FOR I←1 STEP 1 UNTIL NF%2 DO
IF FEAT[3,PREPIC,I]>BST ∧ FEAT[3,PREPIC,I]<BSTBST ∧
FEAT[1,PREPIC,I]≥PICWID/3 ∧ FEAT[1,PREPIC,I]≤2*PICWID/3 THEN
BEGIN H←I; BST←FEAT[3,PREPIC,I]; END;
BSTBST←BST;
SCANY←10; SCANX←60;
DX1←1 MAX (FEAT[1,PREPIC,H]-SCANX);
DY1←1 MAX (FEAT[2,PREPIC,H]-SCANY);
DX2←PICWID MIN (FEAT[1,PREPIC,H]+SCANX+WINDOW-1);
DY2←PICHIG MIN (FEAT[2,PREPIC,H]+SCANY+WINDOW-1);
T←BSTCOR(PIC[PREPIC,1],FEAT[1,PREPIC,H],FEAT[2,PREPIC,H],
FEAT[1,PREPIC,H]+WINDOW-1,FEAT[2,PREPIC,H]+WINDOW-1,
PIC[CURPIC,1],DX1,DY1,DX2,DY2);
FEAT[1,CURPIC,H]←DX1; FEAT[2,CURPIC,H]←DY1; FEAT[3,CURPIC,H]←T;
END UNTIL T≤8 ∨ BST=0;
RETURN(IF BST=0 THEN 0 ELSE H);
END;
PROCEDURE PICTURE(INTEGER PICNO);
BEGIN
INTEGER ARRAY TEMPIC[1:PICSIZ],HIST[0:2↑PICBIT-1];
EXTERNAL INTEGER FLINE,LLINE,LSIDE,RSIDE;
EXTERNAL INTEGER TVWORD,TVCAM,HOFF,VOFF,ERROR;
EXTERNAL PROCEDURE TVIN;
INTEGER I,J,BP,PMAX,PMIN;
FLINE←(256-PICHIG)%2;
LLINE←FLINE+PICHIG-1;
LSIDE←(333-PICWID)%2;
RSIDE←LSIDE+PICWID-1;
TVWORD←(-PICSIZ LSH 18) LOR LOCATION(PIC[PICNO,1])-1;
TVCAM←0;
HOFF←0;
VOFF←0;
ERROR←1;
TCLIP←0; BCLIP←7;
TVIN;
BP←POINT(PICBIT,PIC[PICNO,1],-1);
FOR I←1 STEP 1 UNTIL 2↑PICBIT-1 DO HIST[I]←0; HIST[0]←-(PICWIZ-PICWID)*PICHIG;
FOR I←PICWIZ*PICHIG STEP -1 UNTIL 1 DO
BEGIN J←ILDB(BP); HIST[J]←HIST[J]+1; END;
PMAX←PICWID*PICHIG/9;
FOR I←0 STEP 1 UNTIL 2↑PICBIT-1 DO OUTSTR(CVS(I)&" - "&CVS(HIST[I])&'15&'12);
PMIN←0; I←-1;
WHILE PMIN<PMAX DO BEGIN I←I+1; PMIN←PMIN+HIST[I]; END;
BCLIP←((18-I)*7)%16;
PMIN←0; I←2↑PICBIT;
WHILE PMIN<PMAX DO BEGIN I←I-1; PMIN←PMIN+HIST[I]; END;
TCLIP←((18-I)*7)%16-1;
TVIN;
" CLEAN(TEMPIC[1]); PASSHI(TEMPIC[1],PIC[PICNO,1])";
DDINIT;
SCREEN(-2,-2,2,2);
DRKEN; RECTAN(-2,-2,2,2);
FOR I←4 STEP -1 UNTIL (5-PICBIT) MAX 0 DO
BEGIN
VIDEO(-1,-1,1,1,PIC[PICNO,1],2↑(PICBIT+I-5));
FOR J←1,2,3 DO DPYUP(SYNMAP(I));
END;
END;
PROCEDURE FORWARD(INTEGER TIME);
BEGIN
OUTSTR("FORWARD"&CVS(TIME)&'15&'12);
OUTSTR("TCLIP("&CVS(TCLIP)&"):"); TCLIP←CVD(INCHWL);
OUTSTR("BCLIP("&CVS(BCLIP)&"):"); BCLIP←CVD(INCHWL);
END;
PROCEDURE STEER(INTEGER TIME);
BEGIN
OUTSTR("STEER "&CVS(TIME)&'15&'12);
END;
BOOLEAN PROCEDURE LOCFEAT(INTEGER H; comment feature number;
INTEGER PIC1,PIC2);
BEGIN
INTEGER SCANX,SCANY,DX1,DX2,DY1,DY2,T;
SCANX←30; SCANY←10;
DX1←1 MAX (FEAT[1,PIC1,H]-SCANX);
DY1←1 MAX (FEAT[2,PIC1,H]-SCANY);
DX2←PICWID MIN (FEAT[1,PIC1,H]+SCANX+WINDOW);
DY2←PICHIG MIN (FEAT[2,PIC1,H]+SCANY+WINDOW);
T←BSTCOR(PIC[PIC1,1],FEAT[1,PIC1,H],FEAT[2,PIC1,H],
FEAT[1,PIC1,H]+WINDOW-1,FEAT[2,PIC1,H]+WINDOW-1,
PIC[PIC2,1],DX1,DY1,DX2,DY2);
FEAT[1,PIC2,H]←DX1; FEAT[2,PIC2,H]←DY1; FEAT[3,PIC2,H]←T;
RETURN(IF T>11 THEN FALSE ELSE TRUE);
END;
COMMENT MAIN PROGRAM;
CURPIC←1; PREPIC←2;
PICTURE(CURPIC);
WHILE TRUE DO
BEGIN
INTEGER N,HORFEAT; BOOLEAN LOST;
N←0;
DO comment acquire a horizon feature;
BEGIN
FORWARD(5);
PICTURE(PREPIC); CURPIC↔PREPIC;
END UNTIL (HORFEAT←HORIZON)≠0 ∨ (N←N+1)>5;
STEER((FEAT[1,CURPIC,HORFEAT]-FEAT[1,PREPIC,HORFEAT])/10);
DO comment now track it as long as possible;
BEGIN
FORWARD(5);
PICTURE(PREPIC); CURPIC↔PREPIC;
LOST←LOCFEAT(HORFEAT,PREPIC,CURPIC);
IF ¬LOST THEN STEER((FEAT[1,CURPIC,HORFEAT]-FEAT[1,3-CURPIC,HORFEAT])/10);
END UNTIL LOST;
END;
END;
END;
END;